package com.zff.rental.config.interceptor;


import com.zff.rental.annotation.EnableVerifyToken;
import com.zff.rental.common.ResultCode;
import com.zff.rental.tools.JwtTools;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * 接口调用拦截器
 *
 * @author HCY
 */
@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) {
        // 如果不是映射到方法直接通过
        if (!(handler instanceof HandlerMethod handlerMethod)) {
            return true;
        }

        EnableVerifyToken methodAnnotation = handlerMethod.getMethod().getAnnotation(EnableVerifyToken.class);
        if (null != methodAnnotation) {
            // 方法配置了是否鉴权
            if (!methodAnnotation.value()) {
                // 方法配置了不鉴权
                return true;
            }
        } else {
            // 方法没有配置是否鉴权，则使用类配置
            EnableVerifyToken annotation = handlerMethod.getBeanType().getAnnotation(EnableVerifyToken.class);
            if (null != annotation && !annotation.value()) {
                // 类配置了不鉴权
                return true;
            }
        }
        return verifyToken(request);
    }

    private static boolean verifyToken(HttpServletRequest request) {
        String token = JwtTools.getTokenByServletRequest(request);
        if (ObjectUtils.isEmpty(token)) {
            // Token为空
            throw ResultCode.TOKEN_CANNOT_EMPTY.toException();
        }
        if (!JwtTools.checkToken(token)) {
            // Token 过期或错误
            throw ResultCode.TOKEN_SIGN_ERROR_OR_EXPIRY.toException();
        }
        return true;
    }
}
